package com.itkjb.leisurely.resource.sys.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.itkjb.leisurely.core.base.service.impl.BaseServiceImpl;
import com.itkjb.leisurely.resource.sys.mapper.SysRoleMenuMapper;
import com.itkjb.leisurely.resource.sys.model.SysRoleMenuModel;
import com.itkjb.leisurely.resource.sys.model.vo.SysRoleMenuVO;
import com.itkjb.leisurely.resource.sys.service.ISysRoleMenuService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 角色绑定菜单 服务实现类
 * </p>
 *
 * @author itkjb.com
 * @since 2020-07-28
 */
@Service
public class SysRoleMenuServiceImpl extends BaseServiceImpl<SysRoleMenuMapper, SysRoleMenuModel> implements ISysRoleMenuService {


    /**
     * 根据roleId 或者 menuId 查询
     * @param id
     * @param isRoleId ： true 时按照 roleId查询，否则按 menuId查询
     * @return
     */
    @Override
    public List<SysRoleMenuModel> list(Serializable id, boolean isRoleId) {
        QueryWrapper<SysRoleMenuModel> wrapper  = new QueryWrapper<>();
        SysRoleMenuModel model = new SysRoleMenuModel();
        if(isRoleId){
            model.setRoleId(id.toString());
        }else{
            model.setMenuId(id.toString());
        }
        // 组装 查询的列
        buildListSelectColumns(wrapper, model);
        // 组装 查询条件
        assembleWrapper(wrapper, model);

        return list(wrapper);
    }

    /**
     * 根据角色id，绑定多个菜单
     * @param vo
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public SysRoleMenuVO saveBindByRoleId(SysRoleMenuVO vo){
        QueryWrapper<SysRoleMenuModel> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(SysRoleMenuModel::getRoleId, vo.getRoleId());
        // 删除原来的权限
        this.baseMapper.delete(wrapper);
        List<SysRoleMenuModel> list = new ArrayList<>();
        vo.getMenuIds().forEach(menuId -> {
            SysRoleMenuModel tem = new SysRoleMenuModel();
            tem.setRoleId(vo.getRoleId());
            tem.setMenuId(menuId);
            list.add(tem);
        });
        this.saveBatch(list);
        return vo;

    }

    /**
     * wrapper 组装器，构造条件查询
     * @author itkjb.com
     * @date  2020-07-28
     * @param wrapper
     * @param model 条件
     **/
    @Override
    protected void assembleWrapper(QueryWrapper<SysRoleMenuModel> wrapper, SysRoleMenuModel model) {
        // （代码生成器生成）自动生成了，list查询的时候，条件组装，开发者自行删除不需要的条件
        // 角色id
        wrapper.lambda().eq(StringUtils.isNotBlank(model.getRoleId()), SysRoleMenuModel::getRoleId, model.getRoleId() );
        // 菜单id
        wrapper.lambda().eq(StringUtils.isNotBlank(model.getMenuId()), SysRoleMenuModel::getMenuId, model.getMenuId() );
    }

    /**
     * wrapper 组装器，组装list查询时，查询的列
     * @author itkjb.com
     * @date  2020-07-28
     * @param wrapper
     * @param model
     * @return void
     * @since 2020-07-28
     **/
    @Override
    protected void buildListSelectColumns(QueryWrapper<SysRoleMenuModel> wrapper, SysRoleMenuModel model){
        buildCommonSelectColumns(wrapper, model);
    }

    /**
     * 组装列表查询的列（字段）
     * @date  2020-07-28
     * @param wrapper
     * @param model
     */
    protected void buildCommonSelectColumns(QueryWrapper<SysRoleMenuModel> wrapper, SysRoleMenuModel model){
        // 代码生成器生成，为了简化开发时，查询list时，查询指定字段，没必要查询所有参数
        wrapper.lambda().select(
            // id
            SysRoleMenuModel::getId,
            // 角色id
            SysRoleMenuModel::getRoleId,
            // 菜单id
            SysRoleMenuModel::getMenuId,
            SysRoleMenuModel::getCreateTime
        );
    }


}
